/**
 * @file: Mazo.cpp.
 * @author: Edwin Marcelo Guzman Buezo.
 * @date: MAY-18-2009.
 * @desc: Este archivo contiene la clase Mazo.
 */

#include <ctime>
#include <iostream>
#include <list>
#include <vector>

#include "Carta.h"
#include "Mazo.h"

using namespace std;

Mazo::Mazo()
{
    Mazo::crearCartas();
    barajarCartas();
}

Mazo::~Mazo()
{
    vector<Carta*>::iterator it;
    Carta* carta = NULL;
    for (it = _cartasCreadas.begin(); it != _cartasCreadas.end(); it++)
    {    
        carta = *it;
        delete carta;
    }
    _cartasCreadas.clear();
}

void Mazo::crearCartas()
{
    _cartasCreadas.clear();
    _cartasCreadas.reserve(NUMERO_CARTAS);
    Carta* carta = NULL;
    for (Palo palo = _MENOR_PALO; palo <= _MAYOR_PALO; palo++)
    {
        for (Valor valor = _MENOR_VALOR; valor <= _MAYOR_VALOR; valor++)
        {
            carta = new Carta(palo, valor);
            _cartasCreadas.push_back(carta);
        }
    }
}

void Mazo::barajarCartas()
{
    srand ( (unsigned int) time(0) );//Hace que la funcion rand() sea diferente en distintos
                                     //momentos, si se crean dos mazos al mismo tiempo el resultado
                                     //sera el mismo
    _cartasEnMazo.clear();
    _cartasEnMazo.resize(NUMERO_CARTAS); //reserve;

    // Listar temporalmente las cartas
    list<Carta*> cartas(_cartasCreadas.begin(),_cartasCreadas.end());

    // Barajar _cartasEnMazo
    int posicion;
    list<Carta*>::iterator it;
    for (int i = 0; i < NUMERO_CARTAS; i++)
    {
        posicion = rand() % (NUMERO_CARTAS - i);
        it = cartas.begin();
        advance(it, posicion);
        _cartasEnMazo[i] = *it;     //Asignar carta a _cartasEnMazo[i]
        cartas.erase(it);           //Remover carta
    }
}

Carta* Mazo::repartirNext()
{
    Carta* carta = NULL;
    if(!_cartasEnMazo.empty())
    {
        carta = _cartasEnMazo.back();
        _cartasEnMazo.pop_back();
    }
    else
    {
        cout << "Se acabo el mazo" << endl;
    }
    return carta;
}
